// const NewPromise = function (fun) {
//   this.state = null;
//   this.value = null;
//   this.message = null;
//   this.onResolveFull = [];
//   this.onRejectFull = [];

//   const _this = this;

//   function resolve(value) {
//     _this.value = value;
//     _this.state = "resolved";
//     _this.onResolveFull.forEach(function (fn) {
//       fn(_this.value);
//     });
//   }

//   function reject(message) {
//     _this.message = message;
//     _this.state = "reject";
//     _this.onRejectFull.forEach(function (fn) {
//       fn(message);
//     });
//   }

//   try {
//     fun(resolve, reject);
//   } catch (err) {
//     reject(err.message);
//   }
// };

// NewPromise.prototype.then = function (onResolve, onReject) {
//   if (typeof onResolve === "function" && this.state === "resolve") {
//     onResolve(this.value);
//   }

//   if (typeof onReject === "function" && this.state === "reject") {
//     onReject(this.message);
//   }

//   if (this.state === null) {
//     typeof onResolve === "function" && this.onResolveFull.push(onResolve);
//     typeof onReject === "function" && this.onRejectFull.push(onReject);
//   }

//   return this;
// };

// NewPromise.prototype.catch = function (onReject) {
//   if (typeof onReject === "function" && this.state === "reject") {
//     onReject(this.message);
//   }

//   if (this.state === null) {
//     typeof onReject === "function" && this.onRejectFull.push(onReject);
//   }
// };

// var p = new NewPromise((resolve, reject) => {
//   // setTimeout(()=>{
//   //   resolve(4)
//   // }, 1000)
//   setTimeout(() => {
//     reject(new Error("错误信息"));
//   }, 1000);
// });

// p.then((res) => {
//   //4 res
//   console.log(res, "res");
// }).catch((res) => {
//   console.log(res, "res");
// });

// p.then((res1) => {
//   //4 res1
//   console.log(res1, "res1");
// }).catch((res1) => {
//   console.log(res1, "res");
// });

// function createObject(proto) {
//   function f() {}
//   f.prototype = proto;

//   return proto ? new f() : proto;
// }

// Function.prototype.myCall = function (context) {
//   context = context || window;
//   context.fn = this;
//   const args = [...arguments].slice(1);
//   const result = context.fn(...args);
//   delete context.fn;
//   return result;
// };

// Function.prototype.myApply = function (context) {
//   context = context || window;
//   context.fn = this;
//   let result;
//   if (arguments[1]) {
//     result = context.fn(...arguments[1]);
//   } else {
//     result = context.fn();
//   }
//   delete context.fn;
//   return result;
// };

// Function.prototype.myBind = function (context) {
//   const _this = this;
//   const args = [...arguments].slice(1);
//   return function () {
//     return _this.apply(context, args.concat(...arguments));
//   };
// };

// function people() {
//   console.log('this.name' + this.name)
// }

// function Student (name) {
//   this.name = name
//   console.log(this)
// }

// const obj2 = {
//   name: '你好'
// }

// // people.myBind(null)()
// // Student.myBind(obj2)('哈哈哈')

// function curry(func) {
//   return function curried(...args) {
//     if (args.length >= func.length) {
//       return func.apply(this, args);
//     } else {
//       return function(...args2) {
//         return curried.apply(this, args.concat(args2));
//       }
//     }
//   };
// }


// function add (x, y) { return x + y; }

// console.log(curry(add)(1)(2))

// const chalk = require('chalk');

// let count = 0
// function testFn(fn) {
//   return function(message) {
//     fn && fn(message)
//     ++count;

//     ((count) => {
//       console.log(chalk.blue(`message: ${count}-${message}`))
//     })(count)
//   }
// }

// function compose (...funcs) {
//   return funcs.reduce((a, b) => {
//     console.log(a, b)

//     return (...args) => a(b(...args))
//   });
// }

// let finalFn2 = compose(...[testFn, testFn]);

// console.log(finalFn2, finalFn2.toString())

// finalFn2((message) => {
//   console.log(message)
// })('????');


let obj = {
  i: 1,
  toString() {
    console.log('toString')
    return `_str_${this.i}`;
  },
  valueOf() {
    console.log('valueOf')
    return this.i;
  },
  // [Symbol.toPrimitive](hint) {
  //   console.log(hint + '_toPrimitive')
  //   return null;
  // 
}

console.log('asdad' + obj + 'asdad')
console.log(obj + 1)
console.log(obj)

class NewDate extends Date {
  toString() {
    console.log('toString')
    return Date.prototype.toString.call(this)
  }

  valueOf() {
    console.log('valueOf')
    return Date.prototype.valueOf.call(this)
  }
}
let date = new NewDate();

console.log('asdad' + date + 'asdad')
console.log(+date)
console.log(date)
